package com.exwave.socialgame.model_wolfgame.wolfdata;

import com.exwave.socialgame.myutils.ParamsException;
import com.exwave.socialgame.myutils.RedisForWolfUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
@ApiModel("Room 房间类")
public class Room {
    /**
     * 房主默认1号位，创建房间
     */
    //user记录房间人数
    @ApiModelProperty("房间ID")
    int key_Room;//房间ID //创建房间时候系统分配
    @ApiModelProperty("房间配置数组")
    Integer[] configure;//房间配置数组，用户创建房间时候上传
    @ApiModelProperty("房主类")
    Player master;//房主
    @ApiModelProperty("位置成员")
    HashMap<Integer, Player> users; //key为位置编号，默认12个位置；
    @ApiModelProperty("房间成员")
    List<Integer> locate_role; //房间成员
    //    int r_type;
    @ApiModelProperty("夜晚数")
    Integer data;//天数
    @ApiModelProperty("当天阶段")
    Integer stage;//当天的阶段
    @ApiModelProperty("房间游戏局数")
    Integer times;//游戏局数，天数大于2天为一次有效局
    @ApiModelProperty("房间游戏记录")
//    List<List<Record>> records;
    List<Record> records; //多局游戏的记录

    /**
     * 接受两个参数，config，list
     * 接受两个参数，configure masterID
     * 返回一个Room对象，填充key_Room
     */
    public Room(int key_Room, Integer[] configure, Player master) {
        users = new HashMap<>(); //初始化user
        locate_role = new ArrayList<>(); //初始化list
        records = new ArrayList<>(); //初始化房间事件记录
        records.add(new Record()); //保证Record get(0)不为空
        this.data = 0;//初始化天数默认就是第一天，天黑即加一
        this.times = 0; //初始化游戏局数默认,点击开始即为一局
        this.stage = 0; //初始化游戏流程为白天
        this.key_Room = key_Room;
        this.configure = configure;
        this.master = master;
    }

    public int getKey_Room() {
        return key_Room;
    }

    /**
     * 加入房间
     * 玩家加入即放入 HashMap<Integer,Player>
     *
     * @param player 玩家类
     * @return boolean
     */
    public Boolean addRoom(Player player) {
        try {
            //入座
            this.users.put(player.getNum(), player);
            //角色list还没写
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 天数加一,返回当前夜晚数
     *
     * @return this.data
     */
    public int toTomorrow() {
        this.data += 1;
        return this.data;
    }

    /**
     * 局数加一，返回当前局数
     */
    public int toNextGame() {
        this.times += 1;
        return this.times;
    }

    /**
     * 进入黑夜，无返回
     */
    public void toNight() {
        this.stage = 1;
    }

    /**
     * 进入白天
     */
    public void toDayNight() {
        this.stage = 0;
    }

    /**
     * 获取当前状态的所有事件
     *
     * @param redisForWolfUtils redis操作
     * @author eventList
     */
    public List<Event> getCurrentEvents(RedisForWolfUtils redisForWolfUtils) {
        List<Event> eventList = new ArrayList<>();
        if (this.stage == 0) { //白天事件
            for (int i = 0; i < 15; i++) {
                Event event = redisForWolfUtils.readEvent(this.key_Room, this.data - 1, this.stage, i);
                if (event != null) {// 存在Role发挥作用
                    eventList.add(event); //将一天所有的Event加入List中
                }
            }
        } else if (this.stage == 1) { //夜晚事件，当天读取
            for (int i = 0; i < 15; i++) {
                Event event = redisForWolfUtils.readEvent(this.key_Room, this.data, this.stage, i);
                if (event != null) {// 存在Role发挥作用
                    eventList.add(event); //将一天所有的Event加入List中
                }
            }
        }
        return eventList;
    }

    /**
     * redis删除当前状态所有操作
     *
     * @param redisForWolfUtils
     * @return
     */
    public void delCurrentEvents(RedisForWolfUtils redisForWolfUtils) {
        if (this.stage == 0) //删除前一天白天事件,因为是在进入夜晚，data+1后调用的
            for (int i = 0; i < 15; i++) {
                Event event = redisForWolfUtils.readEvent(this.key_Room, this.data - 1, this.stage, i);
                if (event != null) {// 存在Role发挥作用
                    redisForWolfUtils.delEvent(this.key_Room, this.data - 1, this.stage, i);
                    //从redis里面删除
                }
            }
        else if (this.stage == 1) //删除当天晚上的事件，在当天白天调用
            for (int i = 0; i < 15; i++) {
                Event event = redisForWolfUtils.readEvent(this.key_Room, this.data, this.stage, i);
                if (event != null) {// 存在Role发挥作用
                    redisForWolfUtils.delEvent(this.key_Room, this.data, this.stage, i);
                    //从redis里面删除
                }
            }
    }

    /**
     * 添加事件直接存储到Room的Record中
     *
     * @param event
     */
    public void addEvent(Event event) {
        /*判断当前是否是为开局状态*/
        if (this.times <= 0)
            throw new ParamsException("请先开始游戏");
        else if (this.data <= 0)
            throw new ParamsException("当前不可提交事件");
        /*判断当前局数是否有Record，首次开局没有Record*/
        if (this.records.size() < this.times) { //当前不存在Records，首先每一局的Record必须创建
            Record record = new Record();
            this.records.add(record); //首先添加一个NULL Record,保证get不为空
        }
        if (this.stage == 0) //白天
            this.records.get(this.times - 1).addDayEvent(this.data, event);
        else if (this.stage == 1) //夜晚
            this.records.get(this.times - 1).addNightEvent(this.data, event);
    }
}
